package ar.com.siavu.controller.batch;

import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import ar.com.siavu.controller.configuration.HibernateUtil;
import ar.com.siavu.controller.memory.AGSingleton;
import ar.com.siavu.domain.Actividad;
import ar.com.siavu.domain.ActividadDiaLibre;
import ar.com.siavu.domain.ActividadDiaOff;
import ar.com.siavu.domain.ActividadDiaSinProgramar;
import ar.com.siavu.domain.ActividadGuardia;
import ar.com.siavu.domain.ActividadPosta;
import ar.com.siavu.domain.Posta;
import ar.com.siavu.domain.Programacion;
import ar.com.siavu.domain.Regla;
import ar.com.siavu.domain.Usuario;

public class CargarPreprogramaciones {

	public void cargarPreprogramaciones(){
		Session s= HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t= s.beginTransaction();
		Criteria critPrep= s.createCriteria(Programacion.class);
//		GregorianCalendar gc= new GregorianCalendar();
//		gc.setTime(new Date());
//		gc.set(GregorianCalendar.DATE, 1);
//		gc.set(GregorianCalendar.MONTH, gc.get(GregorianCalendar.MONTH)+1);
//		gc.set(GregorianCalendar.HOUR_OF_DAY, 0);
//		gc.set(GregorianCalendar.MINUTE, 0);
//		gc.set(GregorianCalendar.SECOND, 0);
		critPrep.add(Restrictions.eq("Plazo.mes",9));
		critPrep.add(Restrictions.eq("Plazo.anio",2010));
		critPrep.add(Restrictions.eq("TipoProgramacion",1));
		critPrep.createAlias("user", "Usuario");
		critPrep.add(Restrictions.eq("user.TipoPosta", 2));
		List<Programacion> preProgramaciones=critPrep.list();
		AGSingleton.getInstance().setPreprogramaciones(new HashMap<Usuario, String[]>());
		for (Programacion programacion : preProgramaciones) {
			Usuario usuario= programacion.getUsuario();
			if (!AGSingleton.getInstance().getPreprogramaciones().containsKey(usuario)){
				AGSingleton.getInstance().getPreprogramaciones().put(usuario, crearArrayString(9, 2010));
			}
			for (Actividad actividad : programacion.getActividades()) {
				if (actividad instanceof ActividadDiaLibre){
					setActividadEnArray(usuario, actividad, "DL");
				}
				if (actividad instanceof ActividadDiaSinProgramar){
					setActividadEnArray(usuario, actividad, "SP");
				}
				if (actividad instanceof ActividadPosta){
					ActividadPosta actividadPosta= (ActividadPosta) actividad;
					actividadPosta.setFechaInicio(actividadPosta.getPosta().getVueloIda().getFechaSalida());
					actividadPosta.setFechaFin(actividadPosta.getPosta().getVueloVuelta().getFechaLlegada());					
					setActividadEnArray(usuario, actividad, ((ActividadPosta) actividad).getPosta().getNombre());
				}
			}
		}
		
		
		
		
	}
	
	public void inicializarJefesComisariosAuxiliares(){
		Session s= HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t= s.beginTransaction();
		Criteria critPosta= s.createCriteria(Posta.class);
		critPosta.createAlias("VueloIda", "vue");
		critPosta.add(Restrictions.in("vue.Numero", new Integer[]{1182,1132,1140,1160,1302,1376,1360,1364}));
		GregorianCalendar gcInicio= new GregorianCalendar();
		gcInicio.set(2010, 9-1, 1, 0, 0);
		GregorianCalendar gcFin= new GregorianCalendar();
		gcFin.set(2010, 9-1, 30, 23, 59);
		critPosta.add(Restrictions.ge("vue.FechaSalida", gcInicio.getTime()));
		critPosta.add(Restrictions.le("vue.FechaSalida", gcFin.getTime()));
		List<Posta> postas= critPosta.list();
		AGSingleton.getInstance().setJefes(new HashMap<Posta, Usuario[]>());
		AGSingleton.getInstance().setComisarios(new HashMap<Posta, Usuario[]>());
		AGSingleton.getInstance().setAuxiliares(new HashMap<Posta, Usuario[]>());
		for (Posta posta : postas) {
			AGSingleton.getInstance().getJefes().put(posta, new Usuario[posta.getVueloIda().getAvion().getCantidadJefesCabinaMaximo()]);
			AGSingleton.getInstance().getComisarios().put(posta, new Usuario[posta.getVueloIda().getAvion().getCantidadComisariosMaximo()]);
			AGSingleton.getInstance().getAuxiliares().put(posta, new Usuario[posta.getVueloIda().getAvion().getCantidadAuxiliaresMaximo()]);
		}
	}

	public void cargarReglas(){
		Session s= HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction t= s.beginTransaction();
		Criteria critPrep= s.createCriteria(Regla.class);
		List<Regla> reglas=critPrep.list();
		AGSingleton.getInstance().setReglasPost(new HashMap<String, Integer>());
		for (Regla regla : reglas) {
			AGSingleton.getInstance().getReglasPost().put(regla.getNomenclatura(), regla.getHorasPostAterrizaje()/24);
			
		}
	}
	private void setActividadEnArray(Usuario usuario, Actividad actividad,
			String off) {
		GregorianCalendar fechaInicio= new GregorianCalendar();
		fechaInicio.setTime(actividad.getFechaInicio());
		GregorianCalendar fechaFin= new GregorianCalendar();
		fechaFin.setTime(actividad.getFechaFin());
		int diaInicio=fechaInicio.get(GregorianCalendar.DAY_OF_MONTH);
		int diaFin=fechaFin.get(GregorianCalendar.DAY_OF_MONTH);
		while (diaInicio <= diaFin) {
			AGSingleton.getInstance().getPreprogramaciones().get(usuario)[diaInicio -1]=off;
			diaInicio++;
		}
	}
	private void setPostaEnArray(Usuario usuario, Actividad actividad,
			String off) {
		GregorianCalendar fechaInicio= new GregorianCalendar();
		fechaInicio.setTime(actividad.getFechaInicio());
		GregorianCalendar fechaFin= new GregorianCalendar();
		fechaFin.setTime(actividad.getFechaFin());
		int diaInicio=fechaInicio.get(GregorianCalendar.DAY_OF_MONTH);
		int diaFin=fechaFin.get(GregorianCalendar.DAY_OF_MONTH);
		while (diaInicio <= (diaFin + AGSingleton.getInstance().getReglasPost().get(off))) {
			if (diaInicio <=diaFin){
				AGSingleton.getInstance().getPreprogramaciones().get(usuario)[diaInicio -1]=off;
			} else {
				AGSingleton.getInstance().getPreprogramaciones().get(usuario)[diaInicio -1]=off+"REST";
			}
			diaInicio++;
		}
	}
	public String[] crearArrayString(int mes, int anio){
		GregorianCalendar gc= new GregorianCalendar();
		gc.set(anio, mes -1, 1);
		int length = gc.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
		String[] result = new String[length];
		for (int i = 0; i < result.length; i++) {
			result[i]="OF";
		}
		return result;
		
	}
}
